package com.zhisheng.filter;

import com.alibaba.fastjson.JSONObject;
import com.zhisheng.pojo.MyResponseResult;
import com.zhisheng.utils.MyJwtUtils;
import com.zhisheng.utils.MyThreadLocalUtils;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.Map;

/**
 * 创建者： 智晟全哥
 */

//@WebFilter(urlPatterns = "/*")
//@Component
public class MyLoginFilter implements Filter {


    //@Autowired
    private MyJwtUtils myJwtUtils;


    // 这个方法在每次浏览器请求的时候,都会执行1次
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("浏览器请求了========================================================================================");
        /*
            1: 获取用户的请求路径,如果是 去登陆,直接放行
            2: 根据请求头 Token 获取令牌
            3: 校验令牌是否合法,如果合法则放行
            4: 如果不合法,则响应一个错误状态对象
         */
        //获取用户的请求路径,为了有更多的功能,需要将 ServletRequest 转成子接口类型
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        String uri = request.getRequestURI();// 获取资源路径  /xxx
        //StringBuffer requestURL = request.getRequestURL();// 获取完整路径,http://xxx
        // 放行
        if("/login".equals(uri)){
            // 放行
            filterChain.doFilter(servletRequest,servletResponse);
            // 走完登陆的资源之后,没有必要走下面关于校验令牌的代码了,因此可以使用return提前结束这个过滤器
            return;
        }
        //2: 根据请求头 Token 获取令牌
        String token = request.getHeader("Token");
        // 3: 校验令牌是否合法,如果合法则放行
        Map<String, Object> map = myJwtUtils.parseJwt(token);
        if(map == null){
            // 说明令牌过期了或者不合法,直接响应一个错误信息即可
            // 为了保持前后端请求响应的规范,这里需要创建一个统一结果对象
            MyResponseResult<Object> result = MyResponseResult.error("NOT_LOGIN");
            // 把result响应给前端;(需要把对象转json) 由于目前代码还没有执行controller,因此需要我们自己手动转成json,并手动响应数据
            String jsonString = JSONObject.toJSONString(result);
            HttpServletResponse response = (HttpServletResponse)servletResponse;
            response.getWriter().println(jsonString);
            return;
        }
        // 合法的情况  先使用ThreadLocal  本地线程保存一个变量,以便于后续使用
        MyThreadLocalUtils.setValue(map);
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
